package com.thinkit.bigdata.web.controller.pubmet;

import com.thinkit.bigdata.web.model.config.SysArea;
import com.thinkit.bigdata.web.model.result.Constants;
import com.thinkit.bigdata.web.model.sec.SysGroup;
import com.thinkit.bigdata.web.model.sec.SysRole;
import com.thinkit.bigdata.web.model.sec.User;
import com.thinkit.bigdata.web.model.sec.UserExample;
import com.thinkit.bigdata.web.service.config.AreaService;
import com.thinkit.bigdata.web.service.sec.GroupService;
import com.thinkit.bigdata.web.service.sec.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 管理session中缓存的一些数据
 * Created by lihongli on 2019/1/15
 */
public class SessionManage {

    @Resource
    protected UserService userService;

    @Resource
    protected GroupService groupService;

    @Resource
    protected AreaService areaService;

    /**
     * 登录时调用此方法
     *
     * @param userInfo
     */
    protected void loginSessionSet(User userInfo) {
        updateUserInfo(userInfo);
        updateAreaInfo();
        updateUserIdentity();
        updateUserIds();
        updateGroupId();
    }

    /**
     * 其他时候全部信息更新
     */
    protected void updateAllInfoInsession() {
        updateUserInfo();
        updateAreaInfo();
        updateUserIdentity();
        updateUserIds();
        updateGroupId();
    }

    /**
     * 更新session中保存的userInfo用户信息
     *
     * @param userInfo
     */
    protected void updateUserInfo(User userInfo) {
        SecurityUtils.getSubject().getSession().setAttribute(Constants.SESSION_USER_INFO, userInfo);
    }

    /**
     * session中已有用户信息 重新查询数据库 更新session中保存的userInfo用户信息
     */
    protected void updateUserInfo() {
        Session session = SecurityUtils.getSubject().getSession();
        User user = (User) session.getAttribute(Constants.SESSION_USER_INFO);
        UserExample example = new UserExample();
        example.createCriteria().andIdEqualTo(user.getId());
        List<User> userList = userService.selectByExample(example);
        if (!userList.isEmpty() && userList.size() == 1) {
            session.setAttribute(Constants.SESSION_USER_INFO, userList.get(0));
        }
    }

    /**
     * 更新session中保存的用户所在省份信息
     */
    protected void updateAreaInfo() {
        Session session = SecurityUtils.getSubject().getSession();
        User user = (User) session.getAttribute(Constants.SESSION_USER_INFO);
        SysArea area = areaService.selectAreaByUserId(user.getId());
        session.setAttribute("areaInfo", area);
    }

    /**
     * 更新session中的用户身份信息
     */
    protected void updateUserIdentity() {
        Session session = SecurityUtils.getSubject().getSession();
        User user = (User) session.getAttribute(Constants.SESSION_USER_INFO);
        Long groupId = user.getGroupid();
        if (groupId == null) {
            session.setAttribute("userIdentity", 2);
        } else {
            // 有所属机构的人员不是超管人员 判断并保存人员身份标识（坐席0，质检员1  其他2）
            Integer type = user.getGroup().getType();
            session.setAttribute("userIdentity", type);
        }
    }

    /**
     * 更新数据权限信息 因为最早起名为id 后来需要取出工号 名称不同步修改了
     * 坐席能看到自己以及其子角色下所有人的工号
     * 质检能看到 自己所在组能看到所有座席组人员以及本人能看到的所有座席组的人员
     * 超管、部门管理员不处理
     */
    protected void updateUserIds() {
        List<User> userList = selectDataPermission();
        if (!userList.isEmpty()) {
            List<String> userIds = new ArrayList<>();
            for (User user : userList) {
                userIds.add(user.getAccount());
            }
            SecurityUtils.getSubject().getSession().setAttribute("userIds", userIds);
        }
    }

    /**
     * 坐席人员只能看到自己的组
     * 质检人员 可以看到自己管辖的坐席组
     */
    protected void updateGroupId() {
        Session session = SecurityUtils.getSubject().getSession();
        User user = (User) session.getAttribute(Constants.SESSION_USER_INFO);
        int type = (int) session.getAttribute("userIdentity");
        if (0 == type) {
            session.setAttribute("groupIds", user.getGroupid());
        } else if (1 == type) {
            // 质检人员 可以看到自己管辖的坐席组
            // 替换为最新的查询方法 List<SysGroup> seatGroupList = userService.selectManagedSeatGroupByUserId(user.getId());
            List<SysGroup> seatGroupList = groupService.selectSeatGroupByQcGroupId(user.getGroupid(), user.getId());
            if (!seatGroupList.isEmpty()) {
                List<Long> seatGroupIdList = new ArrayList<>();
                for (SysGroup group : seatGroupList) {
                    seatGroupIdList.add(group.getId());
                }
                session.setAttribute("groupIds", seatGroupIdList);
            }
        }
    }

    /**
     * 根据用户省份信息查询出来当前登录用户所能看到的所有客服信息
     *
     * @return
     */
    protected List<User> selectDataPermission() {
        // 用来保存数据权限信息
        List<User> datas = new ArrayList<>();
        Session session = SecurityUtils.getSubject().getSession();
        User user = (User) session.getAttribute(Constants.SESSION_USER_INFO);
        // 判断用户身份信息 坐席0，质检员1 其他2
        int type = (int) session.getAttribute("userIdentity");
        // 根据身份标识判断 是否需要去查询数据权限信息
        if (type == 0) {
            // 坐席 能看到的是本人以及本人角色的子角色的的人
            boolean isTL = false;// 标识是不是组长角色
            List<SysRole> rolelist = user.getRolelist();
            for (SysRole sysRole : rolelist) {
                if (sysRole.getParentroleid() == null) {
                    isTL = true;
                    // 如果父角色id为null 说明为组长角色 将组内人员信息全部取出，包含自己
                    UserExample example = new UserExample();
                    example.createCriteria().andGroupidEqualTo(user.getGroupid());
                    List<User> userList = userService.selectByExample(example);
                    for (User u : userList) {
                        datas.add(u);
                    }
                }
            }
            if(!isTL){
                // 当不是组长角色的时候 把自己的信息返回
                datas.add(user);
            }
        } else if (type == 1) {
            // 质检 本人所在组能看到所有座席组人员、以及本人能看到的所有座席组的人员
            datas = userService.selectSeatIdByQc(user.getId(), user.getGroupid());
        }
        return datas;
    }
}
